<?php
/**
 * Created by PhpStorm.
 * User: guokunsheng
 * Date: 2019/08/12
 * Time: 21:15
 */

namespace App\Models\Api;

use App\Tools\Astrolog\Astrolog;
use App\Models\Api\Base;
use App\Exceptions\ApiException;
use DateTime;
use DateTimeZone;
use Cache;
use Log;

/**
 * 新满月点数据
 * 新月 0˚
 * 满月 180˚
 * Class SyzygyTIme
 * @package app\common\model
 */
class SyzygyTIme extends Base
{
    protected $table = 'syzygy_time';

    const CACHE_KEY = 'syzygy_times:[year]-[month]';// . ':' . 年份 . '-' . 月份
    const CACHE_TIME = 86400;// 一天

    /**
     * 获取出生前最近的新满月点度数
     * TODO 加入redis缓存
     * @param array $map ['time'=> 0时区时间戳]
     * @return float|false
     * @throws ApiException
     */
    public function getSyzygyData($map = [])
    {
        $data = false;

        $date = date('Y-m-d H:i:s', $map['time']);
        $minstTime = strtotime('-20 day', $map['time']);
//        $date_format = explode('-', $date);
//        $cacheKey = str_replace('[year]', $date_format[0], self::CACHE_KEY);
//        $cacheKey = str_replace('[month]', $date_format[1], $cacheKey);

        if ($this->cache_on > 0)
        {
//            $data = Cache::get($cacheKey);
        }

        if ($data === false)
        {
            try
            {
//                $data = $this->whereTime('time', '<', $date)->order('time DESC')->field('time,deg')->find()->toArray();
                $data = $this->where('time', '<', $date)->orderBy('time','DESC')->first('time','deg');

                if (!empty($data) && isset($data) && strtotime($data['time']) < $minstTime)
                {
                    $data = [];
                } else
                {
                    $data = json_decode(json_encode($data, true), true);
                }

                if (empty($data))
                {
                    $caclData = $this->createSyzygyData((int)$map['time']);

                    if (!empty($caclData))
                    {
                        // 补充数据库中不存在的数据，查缺补漏
                        $this->insert($caclData);
                        $data = $caclData['deg'];
                    }
                } else
                {
                    $data = $data['deg'];
                }

                if ($this->cache_on > 0)
                {
//                    Cache::set($cacheKey, $data, self::CACHE_TIME);
                }
            }
            catch (\Exception $e)
            {
               // Log::write('请及时补充新满月点数据表：' . $map['time'] . ' : ' . $e->getMessage() . ' =>file:' . $e->getFile() . ' =>line:' . $e->getLine(), 'error');
                throw new ApiException('新满月点查询失败', 200, 0);
            }
        }
        return (float)$data;
    }

    /**
     * 若数据库中没有该数据，生成数据并入库
     * @param null $utTimestamp 0时区时间戳
     * @return array
     */
    public function createSyzygyData($utTimestamp = null)
    {
        $Astrolog = Astrolog::getInstance();

        // 获取最近一次的新满月点
        $data = $Astrolog->calcSyzygyData($utTimestamp);

        return $data;
    }

    /**
     * 判断用户出生时间属于 月盈 （从新月到满月） or 月亏 （从满月到新月）
     * @param string $date 用户出生时间 0时区时间
     * @return bool true 月盈 false 月亏
     */
    public function isWaxingMoon($date = '2020-05-28 05:23'): bool
    {
        try
        {
            $data = $this->where('time', '<', $date)
                ->orderBy('time','ASC')
                ->first('phase')->toArray();
        }
        catch (\Exception $e)
        {
            Log::error('判断用户出生时间属于月盈｜月亏时，获取数据失败：' . $date);
        }
        // 月盈 (新月 0˚ => 满月180˚)
        if (isset($data['phase']) && (int)$data['phase'] === 0)
        {
            return true;
        }
        //月亏 (满月 180˚ => 新月 0˚)
        return false;
    }
}
